package com.ming.learn.from.carl.string;

import com.sun.deploy.util.StringUtils;

/*
题目：541. 反转字符串II
 */
public class Of20201226LeetCode541 {
    /*
    给定一个字符串 s 和一个整数 k，你需要对从字符串开头算起的每隔 2k 个字符的前 k 个字符进行反转。
    如果剩余字符少于 k 个，则将剩余字符全部反转。
    如果剩余字符小于 2k 但大于或等于 k 个，则反转前 k 个字符，其余字符保持原样。
    示例:
    输入: s = "abcdefg", k = 2
    输出: "bacdfeg"
     */
    public static void main(String[] args) {
        System.out.println(reverseStr("1234567", 2));
    }

    /*
    当需要固定规律一段一段去处理字符串的时候，要想想在在for循环的表达式上做做文章。
     */
    private static String reverseStr(String s, int k) {
        for (int i = 0; i < s.length(); i += 2 * k) {
            // 1. 每隔 2k 个字符的前 k 个字符进行反转
            // 2. 剩余字符小于 2k 但大于或等于 k 个，则反转前 k 个字符
            if (i + k <= s.length()) {
                s = reverse(s, i, i + k - 1);
                continue;
            }
            // 3. 剩余字符少于 k 个，则将剩余字符全部反转。
            s = reverse(s, i, s.length() - 1);
        }
        return s;
    }

    private static String reverse(String s, int start, int end) {
        char[] chars = s.toCharArray();
        for (int i = start, j = end; i < j; i++, j--) {
            chars[i] ^= chars[j];
            chars[j] ^= chars[i];
            chars[i] ^= chars[j];
        }
        s = new String(chars);
        return s;
    }
}
